package com.persia.tool;

import com.persia.exception.InValidStateException;
import com.persia.exception.InValidValueException;

import java.util.Collection;

/**
 * 输入校验器
 * 其他校验器默认校验非空
 * @author: caibosi
 * @created: 2013-12-12
 */
public class InputValidator {

    /**
     * 表达式不成立，表示状态不对
     * 比如，理论上join出来应该有值
     * 再比如，一个id应该能取出对象来
     * @param expression
     * @param msg
     */
    public static void checkState(boolean expression,String msg){
        if(expression == false)
            throw new InValidStateException(msg);
    }

    /**
     * 校验表达式
     * @param expression
     * @param msg
     */
    public static void checkTrue(boolean expression,String msg){
        if(expression == false)
            throw new InValidValueException(msg);
    }

    /**
     * 校验非null
     * @param obj
     * @param msg
     */
    public static void checkNotNull(Object obj,String msg){
       if(obj == null)
           throw new InValidValueException(msg);
    }

    /**
     * 校验非null及空白字符
     * @param obj
     * @param msg
     */
    public static void checkNotEmpty(Object obj,String msg){
        checkNotNull(obj,msg);
        if(StringTool.isEmpty(obj.toString()))
            throw new InValidValueException(msg);
    }

    /**
     * 校验集合非空
     * @param collection
     * @param msg
     */
    public static void checkNotEmpty(Collection collection,String msg){
        if(CollectionTool.isEmpty(collection))
            throw new InValidValueException(msg);
    }

    /**
     * 校验是否是数字
     * 包括浮点数
     * @param obj
     * @param msg
     */
    public static void checkIsNumber(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(StringTool.isNumber(obj.toString()) == false)
            throw new InValidValueException(msg);
    }

    /**
     * 校验是否是整数
     * @param obj
     * @param msg
     */
    public static void checkIsInteger(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(StringTool.isInteger(obj.toString()) == false)
            throw new InValidValueException(msg);
    }

    /**
     * 只能是字母a-z, A-Z
     * @param obj
     * @param msg
     */
    public static void checkOnlyAlpha(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.onlyAlphaRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 只能是英文字母或是数字
     * @param obj
     * @param msg
     */
    public static void checkAlphaOrNum(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.alphaOrNumRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 只能是数字，不能有小数点
     * @param obj
     * @param msg
     */
    public static void checkOnlyInteger(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.onlyIntegerRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 只能输入整数(含负数)
     * valid 是指整体的，不是指单个的
     * @param obj
     * @param msg
     */
    public static void checkOnlyValidInteger(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.onlyValidIntegerRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 只能输入汉字
     * @param obj
     * @param msg
     */
    public static void checkOnlyChinese(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.onlyChineseRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 邮箱校验
     * @param obj
     * @param msg
     */
    public static void checkEmail(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.emailRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * ip校验
     * @param obj
     * @param msg
     */
    public static void checkIP(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.ipRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 手机校验
     * @param obj
     * @param msg
     */
    public static void checkPhoneNum(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.phoneNumRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 固定电话校验
     * @param obj
     * @param msg
     */
    public static void checkFixedPhoneNum(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.fixedPhoneNumRgx)==false)
            throw new InValidValueException(msg);

    }

    /**
     * 邮编校验
     * @param obj
     * @param msg
     */
    public static void checkPostCode(Object obj,String msg){
        checkNotEmpty(obj,msg);
        if(obj.toString().matches(RegexTool.postCodeRgx)==false)
            throw new InValidValueException(msg);

    }




    public static void main(String[] args){
        String name = null;
        int age = -1;
        checkIsInteger("092332","h");
        checkOnlyValidInteger("092332","h2");
//        Preconditions.checkNotNull(name, "neme为null");
//        Preconditions.checkArgument(name.length()>0, "neme为\'\'");
//        Preconditions.checkArgument(age>0, "age 必须大于0");
    }
}
